package com.dingding.manager.modules.system.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.dingding.manager.core.shiro.ShiroUser;
import com.dingding.manager.core.util.SpringContextHolder;
import com.dingding.manager.modules.system.dto.role.ResRoleDTO;
import com.dingding.manager.modules.system.service.RoleService;

/**
* @ClassName: DataScopeUtil 
* @Description: 数据范围工具类
* @author SUNZHICHENG 
* @date 2016年12月23日 下午3:21:42 
* @version V2.6.2
 */
public class DataScopeUtil {
	
	/**
	 * @Description: 数据范围过滤
	 * @param user 当前用户
	 * @param organizationAlias 机构表别名
	 * @param userAlias 用户表别名
	 * @param organizationIds 用户有权限访问的公司id集合
	 * @param deptIds 用户有权限访问的部门id的集合
	 * @date 2016年12月23日 下午3:28:56
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	public static String dataScopeFilter(ShiroUser user, String organizationAlias, String userAlias, List<Integer> organizationIds, List<Integer> deptIds){

		StringBuilder sql = new StringBuilder();
		//存放数据范围
		List<Integer> dataScope=new ArrayList<Integer>();
		
			//获取当前用户的角色列表
			List<Integer> roleList = user.getRoleList();
			if (!roleList.isEmpty()) {
					for (Integer roleId : roleList) {
						//获取角色信息
						RoleService roleService = SpringContextHolder.getBean(RoleService.class);
						ResRoleDTO roleInfo = roleService.getRoleById(roleId);
						//将当前角色的数据范围保存
						dataScope.add(roleInfo.getDataScope());
					}
					Integer scope = Collections.min(dataScope);
					//判断角色所能操作的数据范围
					//数据范围：1：所有数据 2：所在公司及以下数据3：所在公司数据 4：所在部门及以下数据 5：所在部门数据 6 ：仅本人数据
					switch (scope) {
						case 1:
							break;
						case 2:
							sql.append(" AND ( "+organizationAlias+".organizationId = "+user.getCompanyId());
							sql.append(" OR "+organizationAlias+".parentId in ("+StringUtils.join(organizationIds, ",")+") ) ");
							break;
						case 3:
							sql.append(" AND "+organizationAlias+".organizationId = "+user.getCompanyId());	
							break;
						case 4:
							sql.append(" AND ( "+organizationAlias+".organizationId = "+user.getDeptId());
							sql.append(" OR "+organizationAlias+".parentId in ( "+StringUtils.join(deptIds, ",")+" ) ) ");
							break;
							
						case 5:
							sql.append(" AND "+organizationAlias+".deptId = "+user.getDeptId());
							break;
							
						case 6:
							if (!userAlias.equals("")) {
								sql.append(" AND "+userAlias+".sysUserId = "+user.getId());
							}
							break;
						}
					
				}
		
		return sql.toString();
	}
	

}
